package io.aicn.lowcode.mapper.dbmanager;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import io.aicn.lowcode.entity.dbmanager.DataDomain;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * 数据域Mapper接口
 * 
 * @author lowcode-generator
 * @since 2025-01-25
 */
@Mapper
public interface DataDomainMapper extends BaseMapper<DataDomain> {

    /**
     * 根据域编码查询数据域
     * 
     * @param domainCode 域编码
     * @return 数据域
     */
    @Select("SELECT * FROM dbm_data_domain WHERE domain_code = #{domainCode}")
    DataDomain selectByDomainCode(@Param("domainCode") String domainCode);

    /**
     * 根据数据类型查询数据域列表
     * 
     * @param dataType 数据类型
     * @return 数据域列表
     */
    @Select("SELECT * FROM dbm_data_domain WHERE data_type = #{dataType} ORDER BY domain_name")
    List<DataDomain> selectByDataType(@Param("dataType") String dataType);

    /**
     * 根据域名称模糊查询
     * 
     * @param domainName 域名称
     * @return 数据域列表
     */
    @Select("SELECT * FROM dbm_data_domain WHERE domain_name LIKE CONCAT('%', #{domainName}, '%') ORDER BY domain_name")
    List<DataDomain> selectByDomainNameLike(@Param("domainName") String domainName);

    /**
     * 检查域编码是否存在
     * 
     * @param domainCode 域编码
     * @param excludeId 排除的ID（用于更新时检查）
     * @return 数量
     */
    @Select("SELECT COUNT(*) FROM dbm_data_domain WHERE domain_code = #{domainCode} AND id != #{excludeId}")
    int countByDomainCodeExcludeId(@Param("domainCode") String domainCode, @Param("excludeId") Long excludeId);

    /**
     * 查询所有可用的数据域
     * 
     * @return 数据域列表
     */
    @Select("SELECT * FROM dbm_data_domain ORDER BY domain_name")
    List<DataDomain> selectAllAvailable();
}